说明:
O-C 2.0
引入了属性(property)
,即@property
预编译指令,它组合了新的预编译指令和新的属性访问器语法。
用途:除非自己定义了相关代码,否则@property
会根据特性
自动生成属性及其setter
和getter
的声明和实现。
兼容性:10.5+
语法:@property[(特性)] 实例变量类型 实例变量名;
注意:还有一个编译指令@synthesize
,用来配合@property
生成getter
和setter
的实现,可以省略(XCode 4.4
之后)。
11.1 使用属性值
AllWeatherRadial.h
说明:对需要设置
setter
和getter
的实例变量使用@property
。
1 |
|
AllWeatherRadial.m
说明:不需要实现被设置了
@propery
的实例属性的getter
和setter
。
1 |
|
main.m
说明:调用相应的属性的
setter
和getter
。
1 |
|
11.1.1 简化接口代码
11.1.2 简化实现代码
11.1.3 点表达式的妙用
说明:
O-C 2.0
引入的新的语法特性,可以更加容易地访问对象的属性。
限制:只能用于对象属性的setter
或getter
。
1 | // getter |
11.2 属性扩展
说明:
@property
对如何生成代码还有一些特性
可以指定,这些特性
将影响setter
代码的生成。
@property 特性 |
说明 | 适用 | 备注 |
---|---|---|---|
assign | 简单赋值,不更改引用计数 |
基础数据类型和C数据类型 | 默认 |
copy | 通过就对象复制出一个新对象(引用计数为1),并释放 旧对象 |
不可变对象(例如NSString) | |
retain | 释放 旧对象,将旧对象的值赋予输入对象,再保留 输入对象 |
其它O-C 对象 |
|
nonatomic | 非线程安全 | 所有类型 | 默认,性能更好 |
atomic | 某种程度的线程安全 | 所有类型 | 在多线程的环境保证get 和set 正确执行,但前提是是使用@synthesize 生成的实现 |
readwrite | 可读写 | 所有类型 | 默认 |
readonly | 只读 | 所有类型 | 只生成getter |
getter=getter名称 | 指定生成的getter 方法名 |
所有类型 | 默认为属性名 |
setter=setter名称 | 指定生成的setter 方法名 |
所有类型 | set属性名 ,匈牙利命名法 |
使用@property
说明:
name
属性为@property(copy)
,engine
属性为@property(retain)
Car.h
1 |
|
Car.m
1 |
|
不使用@property
Car.h
1 |
|
Car.m
说明:
@synthesize
用来生成成员变量的setter
和getter
的实现。
1 |
|
11.2.1 名称的使用
Car.h
1 |
|
Car.m
1 |
|
11.2.2 只读属性
说明:假设某个属性,不想让任何人修改它,则可以对这个
@property
使用readonly
特性,这时,只生成一个getter
方法而不会生成setter
。
1 | @interface Me: NSObject |
11.2.3 自己动手有时更好
计算属性
说明:可以通过
@property
配合@dynamic
指令告诉编译器不生成人和代码或实例变量,通过自定义的getter
创建一个能在运行时计算出此值的访问方法。
注意:如果使用了@dynamic
指令,并企图调用不存在的getter
或setter
方法,你将会的到一个报错。
1 | // @property |
指定getter和setter方法名
说明:可以通过
@property(getter=getter名称)
和@property(setter=setter名称)
自定义geter
和setter
方法的名称。
1 | // getter为isHidden,setter为setHidden(默认) |
11.2.4 特性不是万能的
说明:
@property
只能生成严格意义上的getter
和setter
,不支持那些需要接收额外参数的方法。
1 | // setter有额外的参数 |